SEMANA 17-ACTIVIDAD 03

Sanchez Collao Javiera Andrea

2024-06-28


Antes de comenzar a resolver las Preguntas, vamos a cargar las librerias en R

library(tidyverse)
library(psych)
library(kableExtra)
library(ggplot2)
library(ggthemes)
library(plotly)
library(dplyr)

Supongamos que lanzamos una moneda 5 veces y que X es la v.a. que representa el número de caras (0, 1, 2, 3, 4 y 5).

La variable aleatoria X que representa el numero de caras sigue una distribucion binominal X ~B(n,p) ya que:

  • Existe un número fijo de pruebas idénticas, en este caso, lanzar 5 veces una moneda.
  • El resultado de cada lanzamiento solo puede ser cara o sello, en este caso, cara seria considerado como exito con probabilidad p y cruz como fracaso con la probabilidad 1-p
  • Cada lanzamiento es independiente, es decir, el resultado de un lanzamiento no influye sobre el resultado siguiente.
  • La variable de interes X es el numero de exitos en las n pruebas, es decir, el numero de caras que se obtienen

Como la variable que sigue una distribucion Binominal, podremos definir los siguinetes parametros:

n = 5 # numero de lanzamientos
p = 0.5 # probabilidad que salga cara 

Por lo tanto la variable X que representa el numero de caras el numero sigue una distribucion Binominal X ~B(5,05)

Calcular:

1) Espacio muestral completo

En este ejemplo concreto, se realiza el lanzamiento de una moneda 5 veces, siendo los posibles resultados Cara o Sello, para definir el espacio muestral completo, disponemos del comoando expand.gird() en R, que nos genera un data frame de todas las combinaciones posibles con los vectores que introduzcamos. En este caso serian 5 vectores iguales formados por dos valores, Cara o Sello

espacio_muestral <- expand.grid(c("cara", "sello"),
                                c("cara", "sello"), 
                                c("cara", "sello"),
                                c("cara", "sello"),
                                c("cara", "sello"))

names(espacio_muestral)[1] = "Primer lanzamiento"
names(espacio_muestral)[2] = "Segundo lanzamiento"
names(espacio_muestral)[3] = "Tercer lanzamiento"
names(espacio_muestral)[4] = "Cuarto lanzamiento"
names(espacio_muestral)[5] = "Quinto lanzamiento"


color_celda <- function(x) {
  ifelse(x == "cara", 
         cell_spec(x, "html", color = "white", bold = TRUE, background = "purple"), 
         cell_spec(x, "html", color = "white", bold = TRUE, background = "pink"))
}

espacio_muestral_coloreado <- espacio_muestral %>%
  mutate(across(everything(), ~ color_celda(.)))

# Formato tabla
espacio_muestral_coloreado %>%
  kable(escape = FALSE, format = "html") %>%
  kable_styling(bootstrap_options = c("striped", "bordered", "hover", "responsive"),
                full_width = FALSE,
                position = "center",
                font_size = 16) %>%
  row_spec(0, bold = TRUE, color = "white", align = "center")
Primer lanzamiento Segundo lanzamiento Tercer lanzamiento Cuarto lanzamiento Quinto lanzamiento
cara cara cara cara cara
sello cara cara cara cara
cara sello cara cara cara
sello sello cara cara cara
cara cara sello cara cara
sello cara sello cara cara
cara sello sello cara cara
sello sello sello cara cara
cara cara cara sello cara
sello cara cara sello cara
cara sello cara sello cara
sello sello cara sello cara
cara cara sello sello cara
sello cara sello sello cara
cara sello sello sello cara
sello sello sello sello cara
cara cara cara cara sello
sello cara cara cara sello
cara sello cara cara sello
sello sello cara cara sello
cara cara sello cara sello
sello cara sello cara sello
cara sello sello cara sello
sello sello sello cara sello
cara cara cara sello sello
sello cara cara sello sello
cara sello cara sello sello
sello sello cara sello sello
cara cara sello sello sello
sello cara sello sello sello
cara sello sello sello sello
sello sello sello sello sello

Para comprobar que los datos se han almacenado en un data frame utilizamos el comando de R class().

class(espacio_muestral) #Tipo de estructura en la que se almacenan los datos que hemos a generado 
[1] "data.frame"

2) Número de elementos del espacio muestral completo

Para conocer el número de elementos del espacio muestral completo, podemos:

  • Utilizar el comando dim() de R
dim(espacio_muestral)
[1] 32  5
  • Sacar manualmente el número de filas de nuestro data frame, es decir, el numero de observaciones, que se corresponde con el número de posible combinaciones
n_filas = nrow(espacio_muestral)
n_filas
[1] 32

El numero de elementos del espacio muestral completo es de 32 combinaciones posibles en los 5 lanzamientos.


3) Número de elementos del espacio muestral “sacar 3 caras” y del espacio muestral “sacar 4 caras”.

Nos estan pidiendo el número de combinaciones. de entre las 32 combinaciones posibles de nuestro espacio muestral, donde se han obtenido 3 caras o 4 caras respectivamente. Es decir, nos estan pidiendo el suceso “sacar 3 caras” y el suseso sacar 4 caras”.

Para ello, primro añadimos una columna adicional a nuestro data frame donde aparezca la suma del numero de caras que hay en cada observacion o combinacion posible

# Añadir una columna adicional para contar el número de "caras"
espacio_muestral$total_caras <- rowSums(espacio_muestral == "cara")

color_celda <- function(x) {
  ifelse(x == "cara", 
         cell_spec(x, "html", color = "white", bold = TRUE, background = "purple"), 
         ifelse(x == "sello", 
                cell_spec(x, "html", color = "white", bold = TRUE, background = "pink"),
                x))
}

espacio_muestral_coloreado <- espacio_muestral %>%
  mutate(across(-total_caras, ~ color_celda(.)))

# Filtramos las combinaciones con 3 caras
combinaciones_3_caras <- espacio_muestral %>% filter(total_caras == 3)
n_3_caras <- nrow(combinaciones_3_caras)

# Filtramos las combinaciones con 4 caras
combinaciones_4_caras <- espacio_muestral %>% filter(total_caras == 4)
n_4_caras <- nrow(combinaciones_4_caras)

# Resultados
n_3_caras
[1] 10
n_4_caras
[1] 5
formato <- c("striped", "bordered", "hover", "responsive")

espacio_muestral_coloreado %>%
  kable(escape = FALSE, format = "html") %>%
  kable_styling(bootstrap_options = formato,
                full_width = FALSE,
                position = "center",
                font_size = 16) %>%
  row_spec(0, bold = TRUE, color = "white")
Primer lanzamiento Segundo lanzamiento Tercer lanzamiento Cuarto lanzamiento Quinto lanzamiento total_caras
cara cara cara cara cara 5
sello cara cara cara cara 4
cara sello cara cara cara 4
sello sello cara cara cara 3
cara cara sello cara cara 4
sello cara sello cara cara 3
cara sello sello cara cara 3
sello sello sello cara cara 2
cara cara cara sello cara 4
sello cara cara sello cara 3
cara sello cara sello cara 3
sello sello cara sello cara 2
cara cara sello sello cara 3
sello cara sello sello cara 2
cara sello sello sello cara 2
sello sello sello sello cara 1
cara cara cara cara sello 4
sello cara cara cara sello 3
cara sello cara cara sello 3
sello sello cara cara sello 2
cara cara sello cara sello 3
sello cara sello cara sello 2
cara sello sello cara sello 2
sello sello sello cara sello 1
cara cara cara sello sello 3
sello cara cara sello sello 2
cara sello cara sello sello 2
sello sello cara sello sello 1
cara cara sello sello sello 2
sello cara sello sello sello 1
cara sello sello sello sello 1
sello sello sello sello sello 0

Esta pregunta se puede resolver de 2 formas:

  • Aproximacion 1. Para obtener el suseso de “3 caras” y el suseso de “4 caras” podemos almacenar la variable toral_caras y mediante el comando which, obtener las posiciones de las coordenas que cumplan las condiciones que le impogamos
a = c(espacio_muestral$total_caras)
a
 [1] 5 4 4 3 4 3 3 2 4 3 3 2 3 2 2 1 4 3 3 2 3 2 2 1 3 2 2 1 2 1 1 0
class(a)
[1] "numeric"
b = which( a == 3) #columnas en las que se encuentran 3 caras 
b
 [1]  4  6  7 10 11 13 18 19 21 25
c = which( a == 4) #columnas en las que se encuentran 4 caras
c
[1]  2  3  5  9 17

Para obtener el numero de combinaciones de cara , se puede utilizar el comando length() de b y c

length(b) ## número de combinaciones del suceso de cara
[1] 10
length(c)## número de combinaciones del suceso de cara
[1] 5

El suceso “SACAR 3 CARAS” tiene 10 elementos, mientras que el suceso “SACAR 4 CARAS” tiene 5 elementos

  • Aproximacion 2. Haciendo uso del comando table para calcular las frecuencias, es decir, el numero de elementos de cada observacion. No hay que olvidar convertir la tabla a un nuevo data frame.
mi_tabla = table(espacio_muestral$total_caras)

df = as.data.frame(mi_tabla)

#Cambiamos el nombre de las columnas 
names(df)[1] = "numeros_caras"
names(df)[2] = "numeros_elemementos"

formato <- c("striped", "bordered", "hover", "responsive")
df %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
numeros_caras numeros_elemementos
0 1
1 5
2 10
3 10
4 5
5 1

Con esta tabla podemos ver que se obtiene lo mismo que antes, 10 combinaciones donde aparecen 3 caras y 5 combinaciones donde aparecen 4 caras

4) Probabilidad de que salga 0 caras, 1 cara, 2 caras, 3 caras, 4 caras y 5 caras

Este apartado puede resolverse de 2 diferentes formas

  • Aproximacion 1. Para calcular la probabilidad de que salgan 0 caras, 1 cara, 2 caras, 3 caras, 4 caras y 5 caras vamos a emplear los valores obtenidos en la tabla anterior. Hay que multiplicar la cantidad de combinaciones posibles para cada cara por la probilidad de cada elemento por separado conociendo el numero de elemenentos totales, que es el 32. Esto equivale aplicar la regla de Laplace para hallar la funcion de probabilidad, es decir el numero de casos favorables entre el numero de casos posibles.
p_total  = 1/32
p_total
[1] 0.03125
P_0 = p_total * df[1,2]
P_0
[1] 0.03125
P_1  = p_total * df[2,2]
P_1
[1] 0.15625
P_2  = p_total * df[3,2]
P_2
[1] 0.3125
P_3  = p_total * df[4,2]
P_3
[1] 0.3125
P_4  = p_total * df[5,2]
P_4
[1] 0.15625
P_5  = p_total * df[6,2]
P_5
[1] 0.03125
# Representamos los valores en una tabla

m = matrix(nrow = 6, 
           ncol = 1,
           byrow = TRUE,
           dimnames = list(c("0 caras", "1 caras","2 caras","3 caras","4 caras","5 caras"),
                          c("Funcion_probabilidad") ))

m_df = as.data.frame(m)

m_df[1,1] =P_0
m_df[2,1] =P_1
m_df[3,1] =P_2
m_df[4,1] =P_3
m_df[5,1] =P_4
m_df[6,1] =P_5

formato <- c("striped", "bordered", "hover", "responsive")
m_df %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
Funcion_probabilidad
0 caras 0.03125
1 caras 0.15625
2 caras 0.31250
3 caras 0.31250
4 caras 0.15625
5 caras 0.03125
  • Aproximacion 2. Haciendo uso de los parametros que introdujimos al principio y de los comandos disponibles de R para las distribuciones de variables; Mediante R, P(X=x)=dbinom(x,n,p)
x = c (0,1,2,3,4,5) # nº de caras
n = 5 # númewro de lanzamientos
p = 0.5 # probabilidad de que salga cara

f.prob.x = dbinom (x = x, size = n, prob = p)
f.prob.x
[1] 0.03125 0.15625 0.31250 0.31250 0.15625 0.03125
#Representamos los valores de una tabla

tabla = data_frame(Numero_caras =x,
                   Funcion_Probabilidad = dbinom(x = x, size = n, prob = p))

formato <- c("striped", "bordered", "hover", "responsive")
tabla %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
Numero_caras Funcion_Probabilidad
0 0.03125
1 0.15625
2 0.31250
3 0.31250
4 0.15625
5 0.03125

5) Gráfico de la función de probabilidad

Eje x = número de veces que sale cara. Eje y = probabilidad asociada a que salga ese número de caras.

  • Aproximación 1.

Vamos a emplear los datos que hemos calculados nosotros con la primera aproximacion de calcular la función de probabilidad

Numero_caras = c(0,1,2,3,4,5)
Probabilidad = m_df$Funcion_probabilidad

El numero de caras va en el eje x mientras que la probabilidad asociada a que salga ese numero de caras va en el eje y. Almacenamos la información en dos vectores que luego metemos en la funcion ggplot. Para obtener un grafico interactivo, utilizamos la funcion ggploty

f_p = ggplot( data = m_df, aes(Numero_caras, Probabilidad)) + 
  geom_col(width = 0.7, fill = "pink") +
  labs(title = "Funcion probabilidad variable X", x= "Numero de veces donde el resultados es cara", y = "Probabilidad") + 
  theme_hc() + geom_text(label = Probabilidad, nudge_y = 0.05, check_overlap = T)

p = ggplotly(f_p)
p 
  • Aproximación 2.

Haciendo uso de los parametros que introducimos y de los comandos disponibles de R para las distribuciones de variable

f_p_2 = data.frame(lanzam = 0:5,
                   fun_prob = dbinom (x =0:5, size = 5, prob = 0.5)) %>%
  ggplot(aes(x = (lanzam), y = fun_prob)) + 
  geom_col(width = 0.7, fill = "pink") +
  labs(title = "Funcion probabilidad variable X", x= "Numero de veces donde el resultados es cara", y = "Probabilidad") + 
  theme_hc() + geom_text(label = Probabilidad, nudge_y = 0.05, check_overlap = T) +
  geom_text(label = Probabilidad, nudge_y = 0.05, check_overlap = T)

ggplotly(f_p_2)

6) Función de Distribución

Para calcular la funcion de distribución hay que ir sumando el valor de la funcion de probabilidad prevamiente calculculada. R dispone de una funcion, cumsum que va haciendo la suma acomulada. Al igual que ocurre con la funcion de probabilidad, este apartado puede resolverse de 3 formas diferentes

  • Aproximacion 1.

Haciendo uso de los datos obtenidos previamente del calculo de la funcion de probabilidad

funcion_distribucion = cumsum(Probabilidad)
funcion_distribucion # Es un vector, por lo que luego podemos acceder a sus posiciones 
[1] 0.03125 0.18750 0.50000 0.81250 0.96875 1.00000
# Representamos los valores de la funcion distribucion en una tabla

m = matrix(nrow = 6, 
           ncol = 1,
           byrow = TRUE,
           dimnames = list(c("0 cara", "1 cara","2 caras","3 caras","4 caras","5 caras"),
                          c("Funcion_probabilidad") ))

m_df = as.data.frame(m)

m_df[1,1] =funcion_distribucion[1]
m_df[2,1] =funcion_distribucion[2]
m_df[3,1] =funcion_distribucion[3]
m_df[4,1] =funcion_distribucion[4]
m_df[5,1] =funcion_distribucion[5]
m_df[6,1] =funcion_distribucion[6]

formato <- c("striped", "bordered", "hover", "responsive")
m_df %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
Funcion_probabilidad
0 cara 0.03125
1 cara 0.18750
2 caras 0.50000
3 caras 0.81250
4 caras 0.96875
5 caras 1.00000
  • Aproximacion 2. Haciendo uso de los parametros que introducimos al principio que definen la variable y del los comandos disponibles en R para las distribuciones de variables. Se calcula la funcion de probabilidad y se hace la suma de la misma. Aqui tambien se usa el comando comsun
x = c (0,1,2,3,4,5) # nº de caras
n = 5 # númewro de lanzamientos
p = 0.5 # probabilidad de que salga cara

f.acum.x = cumsum(dbinom (x = x, size = n, prob = p)) 
f.acum.x
[1] 0.03125 0.18750 0.50000 0.81250 0.96875 1.00000
  • Aproximacion 3. Haciendo uso de los parametros que introducimos al principio que definen la variable y del los comandos disponibles en R para las distribuciones de variables. Se calcula directamente la funcion de distribucion mediante el comando pbinom con los parametros que definen la variable
#Representamos los valores de una tabla

tabla = data_frame(Numero_caras =x,
                   funcion_distribucion = pbinom(x,n,p))

formato <- c("striped", "bordered", "hover", "responsive")
tabla %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
Numero_caras funcion_distribucion
0 0.03125
1 0.18750
2 0.50000
3 0.81250
4 0.96875
5 1.00000

Se obtienen los mismos valores valores en los 3 casos al igual que ocurre con la funcion de probabilidad

7) Gráfico de la Función de Distribución.

Para ello vamos a emplear los datos que hemos calculado nosotrso con la primera aproximacion de calcular la funcion de distribucion

f_d = ggplot( data = m_df, aes(Numero_caras, funcion_distribucion)) + 
  geom_line(linetype = 1, color = "pink") +
  labs(title = "Funcion distribucion variable X numero de caras ", x= "Numero de veces donde el resultados es cara", y = "Probabilidad") + 
  theme_hc() + geom_text(label = funcion_distribucion, nudge_y = 0.05, check_overlap = T)

ggplotly(f_d)

8) Probabilidad de que el número de caras sea menor o igual que 3.

x = c (0,1,2,3) # nº de caras
n = 5 # númewro de lanzamientos
p = 0.5 # probabilidad de que salga cara

funcion_probabilidad_menor_igual_3 <- pbinom(3, size = n, prob = p)

funcion_distribucion <- cumsum(dbinom(3, size = n, prob = p))

resultados <- data.frame(
  numero_de_caras = x,
  funcion_probabilidad = funcion_probabilidad_menor_igual_3,
  funcion_distribucion = funcion_distribucion
)


cat("La probabilidad de obtener un número de caras menor o igual que 3 es:", funcion_probabilidad_menor_igual_3, "\n")
La probabilidad de obtener un número de caras menor o igual que 3 es: 0.8125 
formato <- c("striped", "bordered", "hover", "responsive")
resultados %>% kable() %>% kable_styling(bootstrap_options = formato, full_width = FALSE, position = "center",  font_size = 16) %>% row_spec(0, bold = TRUE, color = "pink")
numero_de_caras funcion_probabilidad funcion_distribucion
0 0.8125 0.3125
1 0.8125 0.3125
2 0.8125 0.3125
3 0.8125 0.3125

9) Probabilidad de que el número de caras sea mayor que 2

prob_mayor_que_2 <- 1 - pbinom(2, size = n, prob = p)
cat("La probabilidad de obtener un número de caras mayor que 2 es:", prob_mayor_que_2, "\n")
La probabilidad de obtener un número de caras mayor que 2 es: 0.5 

La probabilidad de obtener un número de caras mayor que 2 es: 0.5

10) Probabilidad de que el número de caras se encuentre entre 1 y 4 (ambos incluidos)

prob_entre_1_y_4 <- pbinom(4, size = n, prob = p) - pbinom(0, size = n, prob = p)
cat("La probabilidad de obtener un número de caras entre 1 y 4 es:", prob_entre_1_y_4, "\n")
La probabilidad de obtener un número de caras entre 1 y 4 es: 0.9375 

La probabilidad de obtener un número de caras entre 1 y 4 es: 0.9375

11) Probabilidad de que el número de caras se encuentre entre 1 y 4 (ambos NO incluidos)

prob_entre_2_y_3 <- pbinom(3, size = n, prob = p) - pbinom(1, size = n, prob = p)
cat("La probabilidad de obtener un número de caras entre 2 y 3 es:", prob_entre_2_y_3, "\n")
La probabilidad de obtener un número de caras entre 2 y 3 es: 0.625 

La probabilidad de obtener un número de caras entre 2 y 3 es: 0.625

12) Esperanza de la v.a. X

# Dataframe con los datos
Numero_caras <- c(0, 1, 2, 3, 4, 5)
Probabilidad <- c(0.03125, 0.15625, 0.3125, 0.3125, 0.15625, 0.03125)
m_df <- data.frame(Numero_caras, Probabilidad)

# Calcular la esperanza de la v.a. X
esperanza <- sum(m_df$Numero_caras * m_df$Probabilidad)

# resultado Esperanza X
paste("La esperanza de la v.a. X es:", esperanza)
[1] "La esperanza de la v.a. X es: 2.5"

La esperanza de la v.a. X es: 2.5

13) Varianza de la v.a. X

esperanza_X2 <- sum((m_df$Numero_caras^2) * m_df$Probabilidad)

varianza <- esperanza_X2 - (esperanza^2)

paste("La varianza de la v.a. X es:", varianza)
[1] "La varianza de la v.a. X es: 1.25"

La varianza de la v.a. X es: 1.25